package chapter1;

import lombok.extern.slf4j.Slf4j;

/**
 * @author caiya
 * @date 2020/3/13 21:34
 */
@Slf4j
public class ThreadLocalTest {
    private static final ThreadLocal<String> THREAD_LOCAL = ThreadLocal.withInitial(() -> "");

    public static void main(String[] args) {
        /**
         * ThreadLocal：线程本地变量
         * 如下启动三个线程：2个 Thread 线程，一个主线程，每个线程都有自己的线程局部变量，
         * ThreadLocal 变量一般都是 static 的，各个线程间是彼此分开的，但是针对一个线程内部又都是静态的
         *
         * 底层实现原理：每个线程内部都有一个 threadLocals 成员变量，每次线程调用 set 或 get 时将该值初始化进去，之所以 threadLocals 变量被
         * 设计为 map 类型，是因为一个线程其实可以关联到很多个 ThreadLocal 变量，
         * 而该 map 的 key：ThreadLocal 的实例的引用，value：ThreadLocal 的 set 设置进去的值
         */
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                log.debug(Thread.currentThread().getName());
                THREAD_LOCAL.set(Thread.currentThread().getName() + " variable");
                log.debug(Thread.currentThread().getName() + ": " + THREAD_LOCAL.get());

            }
        });

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                log.debug(Thread.currentThread().getName());
                log.debug(Thread.currentThread().getName() + ": " + THREAD_LOCAL.get());
            }
        });

        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread1.start();

        log.debug(Thread.currentThread().getName() + ": " + THREAD_LOCAL.get());
    }
}
